package demo07;

/*
 * 如何知道一个父类引用的对象，本来是什么子类？
 * 格式：
 * 对象 instanceof 类名称
 * 这将得到一个boolean值结果，效果是判断前面的对象能不能当作后面类型的实例。
 */
public class Demo02Instanceof {
    public static void main(String[] args) {
        Animal animal = new Dog(); // 本来是一只猫
        animal.eat(); // 猫吃鱼

        // 如果需要调用子类特有方法，就要向下转型
        if (animal instanceof Dog) { // 判断父类引用类型对象animal本来是不是Dog
            Dog dog = (Dog) animal;
            dog.watchHouse(); // 狗看家
        }
        if (animal instanceof Cat) { // 判断父类引用类型对象animal本来是不是Cat
            Cat cat = (Cat) animal;
            cat.catchMouse(); // 猫抓老鼠
        }

        // instanceof实用场景：在方法中进行判断
        giveMeAPet(new Dog());
    }

    public static void giveMeAPet(Animal animal) {
        // 方法不知道进入的参数是猫还是狗，所以才要进行判断后使用
        if (animal instanceof Dog) {
            Dog dog = (Dog) animal;
            dog.watchHouse();
        }
        if (animal instanceof Cat) {
            Cat cat = (Cat) animal;
            cat.catchMouse();
        }
    }
}
